/*
 * Combinacao.cpp
 * Created on: 24/11/2011
 * Author: Arthur Holanda
 */

#include "model/Combinacao.h"

Combinacao::Combinacao() {
}

Combinacao::~Combinacao() {
	if (cartas != null) {
		delete cartas;
	}
}

int Combinacao::CompareTo(Combinacao *combinacao) {

	if (this->tipoCobinacao > combinacao->GetTipoCombinacao()) {
		return 1;
	} else if (this->tipoCobinacao < combinacao->GetTipoCombinacao()) {
		return -1;
	} else {
		if (tipoCobinacao == HIGH_CARD) {
			if (this->GetHighCard()->ValeMais(combinacao->GetHighCard())) {
				return 1;
			} else if (combinacao->GetHighCard()->ValeMais(this->GetHighCard())) {
				return -1;
			} else {
				return 0;
			}
		}

		if (tipoCobinacao == ONE_PAIR) {
			if (((Carta*) (this->GetCartas()->GetAt(0)))->GetNumero()
					> ((Carta*) (combinacao->GetCartas()->GetAt(0)))->GetNumero()) {
				return 1;
			} else if (((Carta*) (this->GetCartas()->GetAt(0)))->GetNumero()
					> ((Carta*) (combinacao->GetCartas()->GetAt(0)))->GetNumero()) {
				return -1;
			} else {
				return 0;
			}
		}

		if (tipoCobinacao == TWO_PAIRS) {
			if (((Carta*) (this->GetCartas()->GetAt(2)))->GetNumero()
					> ((Carta*) (combinacao->GetCartas()->GetAt(2)))->GetNumero()) {
				return 1;
			} else {
				if (((Carta*) (this->GetCartas()->GetAt(0)))->GetNumero()
						> ((Carta*) (combinacao->GetCartas()->GetAt(0)))->GetNumero()) {
					return 1;
				} else if (((Carta*) (this->GetCartas()->GetAt(0)))->GetNumero()
						< ((Carta*) (combinacao->GetCartas()->GetAt(0)))->GetNumero()) {
					return -1;
				} else {
					return 0;
				}
			}
		}

		if (tipoCobinacao == THREE_OF_A_KIND) {
			if (((Carta*) (this->GetCartas()->GetAt(0)))->GetNumero()
					> ((Carta*) (combinacao->GetCartas()->GetAt(0)))->GetNumero()) {
				return 1;
			} else if (((Carta*) (this->GetCartas()->GetAt(0)))->GetNumero()
					< ((Carta*) (combinacao->GetCartas()->GetAt(0)))->GetNumero()) {
				return -1;

			} else {
				return 0;
			}
		}

		if (tipoCobinacao == STRAIGHT) {
			if (this->GetHighCard()->ValeMais(combinacao->GetHighCard())) {
				return 1;
			} else if (combinacao->GetHighCard()->ValeMais(this->GetHighCard())) {
				return -1;
			} else {
				return 0;
			}
		}

		if (tipoCobinacao == FULL_HOUSE) {
			if (((Carta*) (this->GetCartas()->GetAt(0)))->GetNumero()
					> ((Carta*) (combinacao->GetCartas()->GetAt(0)))->GetNumero()) {
				return 1;
			} else {
				if (((Carta*) (this->GetCartas()->GetAt(3)))->GetNumero()
						> ((Carta*) (combinacao->GetCartas()->GetAt(3)))->GetNumero()) {
					return 1;
				} else if (((Carta*) (this->GetCartas()->GetAt(3)))->GetNumero()
						< ((Carta*) (combinacao->GetCartas()->GetAt(3)))->GetNumero()) {
					return -1;
				} else {
					return 0;
				}
			}
		}

		if (tipoCobinacao == FOUR_OF_A_KIND) {
			if (((Carta*) (this->GetCartas()->GetAt(0)))->GetNumero()
					> ((Carta*) (combinacao->GetCartas()->GetAt(0)))->GetNumero()) {
				return 1;
			} else if (((Carta*) (this->GetCartas()->GetAt(0)))->GetNumero()
					> ((Carta*) (combinacao->GetCartas()->GetAt(0)))->GetNumero()) {
				return -1;
			} else {
				return 0;
			}
		}
	}
	return 0;
}

void Combinacao::Construct(TipoCombinacao tipoCombinacao, ArrayList *cartas,
	Carta *highCard) {
this->tipoCobinacao = tipoCombinacao;
this->cartas = cartas;
this->highCard = highCard;
}

Carta *Combinacao::GetHighCard() {
return highCard;
}

ArrayList *Combinacao::GetCartas() {
return cartas;
}

TipoCombinacao Combinacao::GetTipoCombinacao() {
return tipoCobinacao;
}

bool Combinacao::Contem(Carta* c) {

if (this->tipoCobinacao != HIGH_CARD) {
	for (int i = 0; i < cartas->GetCount(); ++i) {
		if (c->Equals((Carta*) cartas->GetAt(i))) {
			return true;
		}
	}
}

return false;
}

String Combinacao::ToString() {
String jogada = "";

switch (GetTipoCombinacao()) {
case ROYAL_STRAIGHT_FLUSH:
	jogada = "Royal Straight Flush";
	break;
case STRAIGHT_FLUSH:
	jogada = "Straight Flush";
	break;
case FOUR_OF_A_KIND:
	jogada = "Four of a kind";
	break;
case FULL_HOUSE:
	jogada = "Full House";
	break;
case STRAIGHT:
	jogada = "Straight";
	break;
case FLUSH:
	jogada = "Flush";
	break;
case THREE_OF_A_KIND:
	jogada = "Three of a kind";
	break;
case TWO_PAIRS:
	jogada = "Two Pairs";
	break;
case ONE_PAIR:
	jogada = "One Pair";
	break;
case HIGH_CARD:
	jogada = "High Card";
	break;
default:
	jogada = "Erro";
	break;
}

return jogada;
}
